home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok17.lha / IFFtoImage / IFFtoImage.dok < prev    next >
Text File  |  1993-08-15  |  4KB  |  149 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program    : IFFtoImage.mod
  3.     :Author     : Jochen P. Kupfer
  4.     :Address    : Buchenweg 22, D-4006 Erkrath 2
  5.     :Phone      : 02104-40673
  6.     :Shortcut   : [SIGMA]
  7.     :Version    : 1.0
  8.     :Date       : 3/23/89
  9.     :Copyright  : PD
  10.     :Language   : Modula-2
  11.     :Translator : M2Amiga V 3.2
  12.     :Imports    : LoadIFF.mod [fbs] & LoadBody [fbs]
  13.     :UpDate     : none
  14.     :Contents   : Converts IFF-Brush to ImageData-File.
  15.     :Remark     : Derived from Pit Burkardt's IFFtoCode.mod on Amok # 3.
  16. ---------------------------------------------------------------------------*)
  17.  
  18. - DOKUMENTATION zum Programm: IFFtoImage
  19.   --------------------------------------
  20.  
  21. 1. Vorgeschichte:
  22.  
  23. Wollte man bisher Images in einem Programm verwenden, sei es für MenuItems,
  24. Gadgets oder auch nur so, dann gab es dafür 2 Möglichkeiten:
  25.  
  26. a) Millimeterpapier und Taschenrechner bemühen - vergiß es!
  27. b) IFF-Brush (z.B. mit DPaint) zeichnen, und mit Pit Burkharts
  28.    Programm IFFtoCode in Modula-2 Source-Code umwandeln.
  29.  
  30. Die zweite Methode hatte aber mehrere Nachteile:
  31.  
  32. a) Das Implementationsmodul wurde sehr schnell ziemlich lang.
  33.    Beispiel: Aus einer 3 kBytes IFF-Brush wurden über 70 kBytes
  34.              Source-Code.
  35. b) .def- und .mod-Files mußten kompiliert werden und lassen damit
  36.    das lauffähige Programm anschwellen.
  37. c) Die Image-Daten belegen den Speicher 3fach.
  38.  
  39. Wegen a) schrieb ich nun Pit an und bat ihn, IFFtoCode doch so umzu-
  40. schreiben, daß ein etwas kompakterer Source-Code entstünde. Daraufhin
  41. antwortete Pit, daß das nur die halbe Miete sei, und wies mich erst auf die
  42. Punkte b) und c) hin. Er meinte aber, daß er im Moment leider keine Zeit
  43. hätte, das Programm entsprechend abzuändern.
  44.  
  45. Also hab' ich es selbst getan. Allerdings liegen die Daten nun nicht,
  46. wie von Pit vorgeschlagen, als BitMap vor, sondern sind sofort als Image
  47. verwendbar. Grund: Ich hab' keine Ahnung, wie ich aus einer BitMap so
  48. einfach ein Image bekommen soll.
  49.  
  50.  
  51. 2. Anwendung:
  52.  
  53. 2.1: Umwandlung der IFF-Brush in das Image-Datenfile:
  54.  
  55. Vom CLI aus: IFFtoImage IFF-Brush-Name           ... fertig.
  56.  
  57. Von der Workbench aus:  IFF-Brush-Icon 1x anklicken, SHIFT-Taste drücken,
  58.                         IFFtoImage 2x anklicken  ... fertig.
  59.  
  60. Ergebnis: Das erzeugte Image-Datenfile hat dann den IFF-Brush-Namen
  61.           plus die Endung '.img'
  62.  
  63.  
  64. 2.2 Verwendung im Programm:
  65.  
  66. Die ersten 3 Langworte im Image-Datenfile enthalten die Werte für
  67.  
  68.      Imagebreite,      \
  69.                         } in Pixel,
  70.      Imagehöhe,        /
  71.      Anzahl der Bitplanes.
  72.  
  73. Der Rest des Image-Datenfiles enthält die eigentlichen Image-Daten.
  74. Da das Datenfile UBytes enthält, ich im Programm aber LONGINTs benötige,
  75. vereinbare ich im Programm den anonymen Record BLOCK:
  76.  
  77. TYPE
  78.   BLOCK = RECORD
  79.     CASE :BOOLEAN OF
  80.       | TRUE : l:ARRAY[0..2] OF LONGINT;
  81.       | FALSE: b:ARRAY[0..11] OF UByte;
  82.     END;
  83.   END;
  84.  
  85. VAR
  86.   block    :BLOCK;
  87.  
  88. Hole mir das Datenfile
  89.  
  90.   Lookup(data,Name,1024,FALSE);  (* FALSE = OldFile *)
  91.  
  92. lese die ersten 12 Bytes ein
  93.  
  94.   ReadByteBlock(data,block.b);
  95.  
  96. hole die Filelänge
  97.  
  98.   Length(data,dlength);      (* need filelength for AllocMem *)
  99.  
  100. kürze die Filelänge um die ersten 12 Bytes
  101.  
  102.   buffsize := dlength-12;
  103.  
  104. reserviere mir einen Puffer im ChipMem
  105.  
  106.   AllocMem(buffPtr,buffsize,TRUE); (* TRUE = ChipMem! *)
  107.  
  108. schließe das Datenfile wieder
  109.  
  110.   Close(data);
  111.  
  112. und schon kann ich mein Image definieren:
  113.  
  114.   WITH Img DO
  115.      leftEdge := 10;
  116.      topEdge  := 10;
  117.         width := block.l[0];     (* read as UBytes, used as LONGINTs *)
  118.        height := block.l[1];
  119.         depth := block.l[2];
  120.     imageData := buffPtr;
  121.     planePick := 3;              (* for planes 0 and 1 to pick *)
  122.    planeOnOff := 0;
  123.     nextImage := NIL;
  124.   END;
  125.  
  126. Mit DrawImage(rPtr,ADR(Img),10,10); läßt es sich z.B. auf den Bildschirm
  127. bringen.
  128.  
  129. Auch einer Verwendung in Gadgets oder MenuItems steht damit nichts mehr im
  130. Wege. Wer noch nähere Hinweise braucht, der sehe sich den Sorce-Code im
  131. File ImgDemo.mod an.
  132.  
  133.  
  134. 3. Mehrere IFF-Brushes:
  135.  
  136. Das Programm IFFtoImage verarbeitet immer nur einzelne IFF-Brushes. Mehrere
  137. IFF-Brushes müssen hintereinander konvertiert werden. Bei der Verwendung
  138. sollten diese dann in einer Schleife und/oder einer Prozedur eingelesen
  139. werden.
  140.  
  141. 4. Probleme:
  142.  
  143. Konnte ich im Moment noch keine feststellen. Für etwaige Hinweise bin ich
  144. jedoch immer dankbar.
  145.  
  146.  
  147.                              Jochen (SIGMA) für A.I.T.  (23-3-89)
  148.  
  149.